افتح قوة نظام الأذونات في جانغو مع هذا الدليل المتعمق للتحكم في الوصول. تعلم كيفية تعريف وتنفيذ وإدارة الأذونات لتطبيقات الويب الآمنة وقابلة للتطوير.
إتقان نظام الأذونات في جانغو: دليل شامل للتحكم في الوصول
في عالم تطوير الويب، الأمن له أهمية قصوى. جانغو، إطار عمل ويب قوي بلغة بايثون، يوفر نظام أذونات قوي ومرن لإدارة التحكم في وصول المستخدمين وحماية موارد تطبيقك. يتعمق هذا الدليل الشامل في تعقيدات نظام الأذونات في جانغو، ويقدم أمثلة عملية وأفضل الممارسات لتنفيذ التحكم في الوصول الآمن والقابل للتطوير في مشاريع جانغو الخاصة بك.
فهم المصادقة مقابل التحقق من الهوية
قبل الغوص في تفاصيل نظام الأذونات في جانغو، من الضروري فهم الفرق بين المصادقة والتحقق من الهوية:
- المصادقة (Authentication): تتحقق من هوية المستخدم. تجيب على السؤال "من أنت؟". يتم التعامل مع هذا عادةً من خلال مجموعات اسم المستخدم/كلمة المرور، أو تسجيلات الدخول الاجتماعية، أو موفري الهوية الآخرين.
- التحقق من الهوية (Authorization): يحدد ما يُسمح للمستخدم المصادق عليه بفعله. يجيب على السؤال "ما الذي يُسمح لك بفعله؟". هذا هو المكان الذي يأتي فيه نظام الأذونات في جانغو.
تأتي المصادقة *قبل* التحقق من الهوية. تحتاج إلى معرفة من هو المستخدم قبل أن تتمكن من تحديد ما يُسمح له بالوصول إليه أو تعديله.
نظام الأذونات المدمج في جانغو
يوفر جانغو نظام أذونات مدمج يعتمد على النماذج والمستخدمين والمجموعات. إنه سهل الاستخدام للاحتياجات الأساسية للتحكم في الوصول ولكنه يمكن تمديده وتخصيصه للتعامل مع السيناريوهات الأكثر تعقيدًا.
أذونات النماذج (Model Permissions)
ينشئ جانغو تلقائيًا أذونات افتراضية لكل نموذج، مما يسمح لك بالتحكم في من يمكنه إنشاء، قراءة، تحديث، وحذف مثيلات هذا النموذج. هذه الأذونات هي:
- add_[modelname]: يسمح بإنشاء مثيلات جديدة للنموذج.
- change_[modelname]: يسمح بتحديث المثيلات الموجودة للنموذج.
- delete_[modelname]: يسمح بحذف مثيلات النموذج.
- view_[modelname]: يسمح بعرض مثيلات النموذج (جانغو 3.1+).
على سبيل المثال، إذا كان لديك نموذج يسمى `Article`، فسينشئ جانغو الأذونات التالية:
- `add_article`
- `change_article`
- `delete_article`
- `view_article`
المستخدمون والمجموعات (Users and Groups)
يوفر نظام المصادقة المدمج في جانغو كيانين أساسيين لإدارة الأذونات:
- المستخدمون (Users): حسابات المستخدمين الفردية داخل تطبيقك.
- المجموعات (Groups): مجموعات من المستخدمين مع أذونات مشتركة. هذه طريقة أكثر قابلية للصيانة لتطبيق الأذونات على العديد من المستخدمين في وقت واحد.
يمكنك تعيين الأذونات مباشرة للمستخدمين أو، بشكل أكثر شيوعًا، تعيين الأذونات للمجموعات ثم إضافة المستخدمين إلى تلك المجموعات.
مثال: إدارة أذونات المقالات
لنفترض أن لديك تطبيق مدونة يحتوي على نموذج `Article`. تريد السماح لمستخدمين محددين فقط بإنشاء مقالات جديدة، وتعديل المقالات الموجودة، وحذف المقالات. إليك كيفية تنفيذ ذلك باستخدام نظام الأذونات المدمج في جانغو:
- إنشاء مجموعات: قم بإنشاء مجموعات مثل "محرر" و "كاتب" في لوحة تحكم جانغو الإدارية.
- تعيين الأذونات: قم بتعيين أذونات `add_article` و `change_article` و `delete_article` لمجموعة "محرر". قم بتعيين إذن `add_article` فقط لمجموعة "كاتب".
- إضافة مستخدمين إلى المجموعات: أضف المستخدمين المناسبين إلى مجموعتي "محرر" و "كاتب".
الآن، سيتمتع المستخدمون في مجموعة "محرر" بإمكانية وصول كامل لإدارة المقالات، بينما سيتمكن المستخدمون في مجموعة "كاتب" فقط من إنشاء مقالات جديدة.
تنفيذ الأذونات في العروض (Views)
بمجرد تحديد أذوناتك وتعيينها للمستخدمين أو المجموعات، تحتاج إلى فرض تلك الأذونات في عروضك. يوفر جانغو عدة طرق للقيام بذلك:
المزين `permission_required`
المزين `@permission_required` هو طريقة بسيطة لتقييد الوصول إلى عرض للمستخدمين الذين لديهم أذونات محددة.
from django.contrib.auth.decorators import permission_required
from django.shortcuts import render
@permission_required('myapp.add_article')
def create_article(request):
# Only users with the 'myapp.add_article' permission can access this view
return render(request, 'myapp/create_article.html')
إذا حاول مستخدم بدون الإذن المطلوب الوصول إلى العرض، فسيتم إعادة توجيهه إلى صفحة تسجيل الدخول أو سيتلقى خطأ 403 Forbidden، اعتمادًا على إعداداتك.
`LoginRequiredMixin` و `PermissionRequiredMixin` (للعروض المستندة إلى الفئات)
بالنسبة للعروض المستندة إلى الفئات، يمكنك استخدام `LoginRequiredMixin` و `PermissionRequiredMixin` لفرض المصادقة والتحقق من الهوية:
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.views.generic import CreateView
from .models import Article
class ArticleCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView):
model = Article
fields = ['title', 'content']
permission_required = 'myapp.add_article'
template_name = 'myapp/article_form.html'
يوضح هذا المثال كيفية تقييد الوصول إلى `ArticleCreateView` للمصادق عليهم فقط الذين لديهم إذن `add_article`.
التحقق من الأذونات يدويًا
يمكنك أيضًا التحقق من الأذونات يدويًا داخل عروضك باستخدام الدالة `has_perm()` على كائن المستخدم:
from django.shortcuts import render, redirect
def update_article(request, article_id):
article = Article.objects.get(pk=article_id)
if request.user.has_perm('myapp.change_article', article):
# User has permission to update the article
# Implement update logic here
return render(request, 'myapp/update_article.html', {'article': article})
else:
# User does not have permission
return render(request, 'myapp/permission_denied.html')
في هذا المثال، نتحقق مما إذا كان المستخدم لديه إذن `change_article` لمثيل `article` محدد. هذا يسمح لك بتنفيذ أذونات على مستوى الكائن، حيث يتم منح الأذونات بناءً على الكائن المحدد الذي يتم الوصول إليه.
أذونات مخصصة (Custom Permissions)
غالبًا ما تكون الأذونات المدمجة في جانغو كافية لاحتياجات التحكم في الوصول الأساسية. ومع ذلك، في التطبيقات الأكثر تعقيدًا، قد تحتاج إلى تعريف أذونات مخصصة لتعكس منطق عمل محدد أو متطلبات التحكم في الوصول.
تعريف أذونات مخصصة في النماذج
يمكنك تعريف أذونات مخصصة داخل فئة `Meta` الخاصة بالنموذج باستخدام الخيار `permissions`:
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
published_date = models.DateTimeField(blank=True, null=True)
class Meta:
permissions = [
('can_publish_article', 'Can publish article'),
('can_comment_article', 'Can comment on article'),
]
يحدد هذا المثال إذنين مخصصين: `can_publish_article` و `can_comment_article`. سيتم إنشاء هذه الأذونات تلقائيًا عند تشغيل `python manage.py migrate`.
استخدام الأذونات المخصصة
بمجرد تحديد الأذونات المخصصة الخاصة بك، يمكنك استخدامها بنفس طريقة الأذونات المدمجة، باستخدام المزين `@permission_required`، أو `PermissionRequiredMixin`، أو الدالة `has_perm()`.
from django.contrib.auth.decorators import permission_required
from django.shortcuts import render
@permission_required('myapp.can_publish_article')
def publish_article(request, article_id):
# Only users with the 'myapp.can_publish_article' permission can access this view
article = Article.objects.get(pk=article_id)
article.published_date = timezone.now()
article.save()
return render(request, 'myapp/article_published.html', {'article': article})
أذونات على مستوى الكائن (Object-Level Permissions)
تسمح لك أذونات على مستوى الكائن بالتحكم في الوصول إلى مثيلات محددة من نموذج، بدلاً من منح أذونات عامة لجميع المثيلات. هذا ضروري للتطبيقات التي يجب على المستخدمين فيها فقط الوصول إلى الموارد التي يمتلكونها أو تم منح الوصول إليها صراحةً، أو تعديلها.
تنفيذ أذونات على مستوى الكائن
هناك عدة طرق لتنفيذ أذونات على مستوى الكائن في جانغو:
- التحقق من الأذونات يدويًا: كما هو موضح سابقًا، يمكنك استخدام الدالة `has_perm()` للتحقق من الأذونات لمثيل كائن محدد.
- استخدام مكتبات الطرف الثالث: توفر مكتبات مثل `django-guardian` طرقًا أكثر تنظيمًا وقابلة لإعادة الاستخدام لإدارة أذونات على مستوى الكائن.
مثال: استخدام `django-guardian`
`django-guardian` يبسط عملية تعيين والتحقق من أذونات على مستوى الكائن. إليك مثال أساسي:
- تثبيت `django-guardian`: `pip install django-guardian`
- تهيئة `settings.py`: أضف `'guardian'` إلى `INSTALLED_APPS` وقم بتهيئة الواجهات الخلفية للمصادقة اللازمة.
- تعيين الأذونات: استخدم الدالة `assign_perm()` لمنح الأذونات للمستخدمين أو المجموعات لكائنات محددة.
- التحقق من الأذونات: استخدم الدالة `has_perm()` للتحقق مما إذا كان المستخدم لديه إذن محدد لكائن محدد.
from guardian.shortcuts import assign_perm, get_perms
# Assign the 'change_article' permission to a user for a specific article
assign_perm('change_article', user, article)
# Check if the user has the 'change_article' permission for the article
if user.has_perm('change_article', article):
# User has permission
pass
`django-guardian` يوفر أيضًا `PermissionListMixin` للعروض المستندة إلى الفئات، مما يسهل عرض قائمة بالكائنات التي يمتلك المستخدم الإذن بالوصول إليها.
أذونات جانغو ريست فريمورك (Django REST Framework Permissions)
إذا كنت تبني واجهات برمجة تطبيقات REST باستخدام جانغو ريست فريمورك، فستحتاج إلى استخدام فئات الأذونات الخاصة به للتحكم في الوصول إلى نقاط نهاية واجهة برمجة التطبيقات الخاصة بك. يوفر DRF العديد من فئات الأذونات المدمجة، بما في ذلك:
- `AllowAny`: يسمح بالوصول غير المقيد إلى نقطة نهاية واجهة برمجة التطبيقات.
- `IsAuthenticated`: يتطلب أن يكون المستخدم مصادقًا عليه للوصول إلى نقطة نهاية واجهة برمجة التطبيقات.
- `IsAdminUser`: يتطلب أن يكون المستخدم مسؤولًا للوصول إلى نقطة نهاية واجهة برمجة التطبيقات.
- `IsAuthenticatedOrReadOnly`: يسمح بالوصول للقراءة فقط للمستخدمين غير المصادق عليهم ولكنه يتطلب المصادقة للوصول للكتابة.
- `DjangoModelPermissions`: يستخدم أذونات نماذج جانغو القياسية للتحكم في الوصول.
- `DjangoObjectPermissions`: يستخدم `django-guardian` لفرض أذونات على مستوى الكائن.
استخدام فئات أذونات DRF
يمكنك تعيين فئات الأذونات لعرض باستخدام السمة `permission_classes`:
from rest_framework import generics
from rest_framework.permissions import IsAuthenticated
class ArticleList(generics.ListCreateAPIView):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
permission_classes = [IsAuthenticated]
يقيد هذا المثال الوصول إلى نقطة نهاية واجهة برمجة تطبيقات `ArticleList` للمستخدمين المصادق عليهم فقط.
أذونات DRF المخصصة
يمكنك أيضًا إنشاء فئات أذونات DRF مخصصة لتنفيذ منطق تحكم في وصول أكثر تعقيدًا. يجب أن ترث فئة الإذن المخصصة من `rest_framework.permissions.BasePermission` وتعيد تعريف الدوال `has_permission()` و/أو `has_object_permission()`.
from rest_framework import permissions
class IsAuthorOrReadOnly(permissions.BasePermission):
"""
Custom permission to only allow authors of an object to edit it.
"""
def has_object_permission(self, request, view, obj):
# Read permissions are allowed to any request,
# so we'll always allow GET, HEAD or OPTIONS requests.
if request.method in permissions.SAFE_METHODS:
return True
# Instance must have an attribute named `author`.
return obj.author == request.user
يحدد هذا المثال فئة إذن مخصصة تسمح فقط لمؤلف المقالة بتعديلها، بينما تسمح بالوصول للقراءة لأي شخص.
أفضل ممارسات الأمان
يعد تنفيذ نظام أذونات قوي أمرًا بالغ الأهمية لتأمين تطبيق جانغو الخاص بك. إليك بعض أفضل ممارسات الأمان التي يجب وضعها في الاعتبار:
- مبدأ الحد الأدنى من الامتياز: امنح المستخدمين فقط الحد الأدنى من الأذونات التي يحتاجونها لأداء مهامهم. تجنب تعيين أذونات غير ضرورية.
- استخدام المجموعات: قم بإدارة الأذونات من خلال المجموعات بدلاً من تعيين الأذونات مباشرة للمستخدمين الأفراد. هذا يبسط الإدارة ويقلل من خطر الأخطاء.
- مراجعات دورية: قم بمراجعة إعدادات الأذونات الخاصة بك بشكل دوري للتأكد من أنها لا تزال مناسبة وأنه لم يتم منح أي وصول غير مصرح به.
- تنقية المدخلات: قم دائمًا بتنقية مدخلات المستخدم لمنع هجمات الحقن التي يمكن أن تتجاوز نظام الأذونات الخاص بك.
- اختبار شامل: اختبر نظام الأذونات الخاص بك جيدًا للتأكد من أنه يعمل كما هو متوقع وأنه لا توجد ثغرات أمنية. اكتب اختبارات آلية للتحقق من فحوصات الأذونات.
- البقاء محدثًا: حافظ على تحديث إطار عمل جانغو والمكتبات ذات الصلة للاستفادة من أحدث تصحيحات الأمان وإصلاحات الأخطاء.
- ضع في اعتبارك سياسة أمان المحتوى (CSP): يمكن لـ CSP المساعدة في منع هجمات البرمجة النصية عبر المواقع (XSS)، والتي يمكن استخدامها لتجاوز آليات المصادقة.
اعتبارات التدويل (Internationalization)
عند تصميم نظام الأذونات الخاص بك لجمهور عالمي، ضع في اعتبارك جوانب التدويل التالية:
- أسماء الأدوار: إذا كان تطبيقك يستخدم أدوارًا (مثل، محرر، كاتب، مشرف)، فتأكد من أن أسماء الأدوار هذه قابلة للترجمة بسهولة ومناسبة ثقافيًا لجميع اللغات المدعومة. ضع في اعتبارك استخدام اختلافات لغوية محددة لأسماء الأدوار.
- واجهة المستخدم: صمم واجهة المستخدم الخاصة بك لتكون قابلة للتكيف مع اللغات والاتفاقيات الثقافية المختلفة. يشمل ذلك تنسيقات التاريخ/الوقت، وتنسيقات الأرقام، واتجاه النص.
- المناطق الزمنية: ضع في اعتبارك المناطق الزمنية المختلفة عند منح أو إلغاء الأذونات بناءً على الأحداث الحساسة للوقت. قم بتخزين الطوابع الزمنية بتنسيق UTC وقم بتحويلها إلى المنطقة الزمنية المحلية للمستخدم للعرض.
- لوائح خصوصية البيانات: كن على دراية بلوائح خصوصية البيانات في بلدان مختلفة (مثل، GDPR في أوروبا، CCPA في كاليفورنيا). قم بتطبيق آليات موافقة مناسبة وتدابير حماية البيانات.
- إمكانية الوصول: تأكد من أن نظام الأذونات الخاص بك متاح للمستخدمين ذوي الإعاقة، مع الالتزام بمعايير إمكانية الوصول مثل WCAG.
الخلاصة
يوفر نظام الأذونات في جانغو إطار عمل قويًا ومرنًا لإدارة التحكم في الوصول في تطبيقات الويب الخاصة بك. من خلال فهم الميزات المدمجة، والأذونات المخصصة، والأذونات على مستوى الكائن، وأفضل ممارسات الأمان، يمكنك بناء تطبيقات آمنة وقابلة للتطوير تحمي مواردك القيمة. تذكر تكييف نظام الأذونات الخاص بك مع الاحتياجات المحددة لتطبيقك، وقم بمراجعة وتحديث إعداداتك بانتظام لضمان بقائها فعالة.
يقدم هذا الدليل نظرة شاملة على نظام الأذونات في جانغو. مع بناء تطبيقات أكثر تعقيدًا، قد تواجه سيناريوهات أكثر تقدمًا. لا تتردد في استكشاف وثائق جانغو وموارد المجتمع لمزيد من الإرشادات.